package com.yanggu.scala.chapater12.caseclass

object CaseDemo01 {

  def main(args: Array[String]): Unit = {
    //1. 知识点1
    //提取出"漫画"
    println("*********知识点1*********")
    val sale = Bundle("书籍", 10, Book("漫画", 40), Bundle("文学作品", 20, Book("《阳关》", 80), Book("《围城》", 30)))
    val result = sale match {
      //如果我们进行对象匹配时，不想接受某些值，则使用_ 忽略即可，_* 表示匹配所有
      case Bundle(_, _, Book(description, _), _ *) => description
    }
    println(result)

    //2. 知识点2
    //通过@表示法将嵌套的值绑定到变量。_*绑定剩余Item到rest
    println("*********知识点2*********")
    val result2 = sale match {
      case Bundle(_, _, art@Book(_, _), rest@_ *) => (art, rest)
    }
    println("art = " + result2._1)
    println("rest = " + result2._2)

    //3. 不使用_*绑定剩余Item到rest
    //如何将 "漫画" 和 紫色部分
    println("*********知识点3*********")
    val result3 = sale match {
      //说明因为没有使用 _* 即明确说明没有多个Bundle,只有一个Bundle。所以返回的rest，就不是WrappedArray了。
      case Bundle(_, _, art@Book(_, _), rest) => (art, rest)
    }
    println(result3)
    println("art =" + result3._1)
    println("rest=" + result3._2)

  }

  abstract class Item // 项

  case class Book(description: String, price: Double) extends Item

  //Bundle 捆 ， discount: Double 折扣 ， item: Item* , Item*表示可变参数
  case class Bundle(description: String, discount: Double, item: Item*) extends Item

  //给出案例表示有一捆数，单本漫画（40-10） + 文学作品(两本书)（80+30-20） = 30 + 90 = 120.0
  //val sale = Bundle("书籍", 10,  Book("漫画", 40), Bundle("文学作品", 20, Book("《阳关》", 80), Book("《围城》", 30)))


}
